<?php
/**
 * Created by Alan.
 * User: Alan
 * Date: 2018\8\20 0020
 * Time: 13:58
 */

namespace app\api\controller\v1;
use app\api\controller\BaseController;
use app\api\service\Token as TtokenService;
use app\api\service\Token;
use app\api\validate\IDMustBePositiveInt;
use app\api\validate\OrderPlace;
use app\api\service\Order as OrderService;
use app\api\validate\PagingParameter;
use app\api\model\Order as OrderModel;
use app\lib\exception\OrderException;

class Order extends BaseController
{
    //用户在选择商品后,向api提交包含他所选择商品的相关信息
    //api在接受到信息后，需要检查订单相关商品的库存量
    //有库存，将订单数据存入数据库中 = 下单成功了，返回客户端消息，告诉客户端可以支付了
    //调用支付接口，进行支付
    //再次进行库存量的检测
    //服务器这边调用微信的预支付接口进行支付
    //小程序根据服务器返回的结果拉起微信支付
    //微信会返回给我们一个支付的结果（异步）
    //成功：进行库存量的检查
    //成功: 进行库存量的扣除

    //做一次库存量检测
    //创建订单
    //减库存 --预扣除库存
    //if 支付 真正的减库存
    //在一定时间内没有去支付这个订单，我们需要还原库存

    //在php里写一个定时器，每个1min去遍历数据库，找到那些超时的
    //订单，把这些订单给还原库存
    //linux crontab

    // 任务队列
    //订单任务加入到任务队列里
    //redis

    //定时器，每个1s,5s,访问API接口

   protected $beforeActionList = [
       'checkExclusiveScope' => ['only' => 'placeOrder'],
       'checkPrimaryScope' => ['only' => 'getDetail,getSummayByUser']
   ];

   public function getSummaryByUser($page = 1,$size = 15)
   {
       (new PagingParameter())->goCheck();
       $uid = Token::getCurrentUid();
       $pagingOrders = OrderModel::getSummaryByUser($uid, $page, $size);
       if($pagingOrders->isEmpty()){
            return [
                'data' => [],
                'current_page' => $pagingOrders->getCurrentPage()
            ];
       }
       $data = $pagingOrders->hidden(['snap_items','snap_address','prepay_id'])->toArray();
       return [
           'data' => $data,
           'current_page' => $pagingOrders->getCurrentPage()
       ];

   }

   public function getDetail($id)
   {
       (new IDMustBePositiveInt())->goCheck();
       $orderDetail = OrderModel::get($id);
       if(!$orderDetail)
       {
            throw new OrderException();
       }
       return $orderDetail->hidden(['prepay_id']);


   }

    public function placeOrder(){
        (new OrderPlace())->goCheck();
        $products = input('post.products/a');
        $uid = TtokenService::getCurrentUid();
        $order = new OrderService();
        $status = $order->place($uid, $products);
        return $status;
    }

    /**
     * 获取全部订单简要信息 （分页）
     * @param int $page
     * @param int $size
     * @return array
     */
    public function getSummary($page = 1,$size = 20)
    {
        (new PagingParameter())->goCheck();
        $pagingOrders = OrderModel::getSummaryByPage($page, $size);
        if($pagingOrders->isEmpty()){
            return [
                'current_page' => $pagingOrders->currentPage(),
                'data' => []
            ];
        }
        $data = $pagingOrders->hidden(['snap_items', 'snap_address'])
            ->toArray();
        return [
            'current_page' => $pagingOrders->currentPage(),
            'data' => $data
        ];
    }

    public function delivery($id)
    {
        (new IDMustBePositiveInt())->goCheck();
        $order = new OrderService();
        $success = $order->delivery($id);
        if($success){
            return new SuccessMessage();
        }
    }
}